//package com.muyangren.poidemo;
//
//import com.deepoove.poi.XWPFTemplate;
//import com.deepoove.poi.config.Configure;
//import com.deepoove.poi.data.RowRenderData;
//import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
//import com.deepoove.poi.policy.DynamicTableRenderPolicy;
//import com.deepoove.poi.policy.TableRenderPolicy;
//import com.deepoove.poi.util.TableTools;
//import com.muyangren.poidemo.entity.FamilyMember;
//import com.muyangren.poidemo.entity.Going;
//import com.muyangren.poidemo.entity.Templates22;
//import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
//import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
//import org.apache.poi.xwpf.usermodel.XWPFDocument;
//import org.apache.poi.xwpf.usermodel.XWPFTable;
//import org.apache.poi.xwpf.usermodel.XWPFTableRow;
//import org.junit.jupiter.api.Assertions;
//import org.junit.jupiter.api.Test;
//import org.springframework.boot.test.context.SpringBootTest;
//import org.springframework.core.io.ClassPathResource;
//
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * ps：如果你是刚入门的，建议就别看了，徒增痛苦，告诉leader这需求不行
// */
//@SpringBootTest
//class PoiDemoApplicationTwoTests2 {
//
//
//    private static final String OUTPUT_PDF_PATH = "C:\\Users\\br-22\\Desktop\\export-word.pdf";
//    private static final String OUTPUT_DOCX_PATH = "C:\\Users\\br-22\\Desktop\\export-word.docx";
//    private static final String TEMPLATE_PATH = "templates/template-two.docx";
//
//    /**
//     * 按照我写的顺序先看一遍
//     */
//    @Test
//    void contextLoads() {
//        try {
//            // 一、初始化数据
//            // 1）初始化模板数据-实际是去数据库查询-自行整合
//            Templates22 templates = initTemplates();
//            // 2）初始化家庭成员信息-实际是去数据库查询-自行整合
//            List<FamilyMember> familyMemberList = initFamilyMember();
//            // 3）初始化工作情况-实际是去数据库查询-自行整合
//            List<Going> goingList = initGoing();
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("templates",templates);
//            map.put("familyMemberList",familyMemberList);
//            map.put("goingList",goingList);
//
//            // 三、绑定插件
//            Configure config = Configure.builder()
//                    .bind("familyMemberList", new LoopRowTableRenderPolicy())
//                    .bind("goingList", new LoopRowTableRenderPolicy())
//                    .build();
//
//            try (InputStream templateStream = new ClassPathResource(TEMPLATE_PATH).getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
//                XWPFTemplate template = XWPFTemplate.compile(templateStream, config).render(map);
//                Assertions.assertNotNull(template);
//                // 写入到byteArrayOutputStream
//                template.write(byteArrayOutputStream);
//                // 输出流【byteArrayOutputStream】转为输入流【ByteArrayInputStream】
//                try (XWPFDocument xwpfDocument = new XWPFDocument(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))) {
//                    // 输出为docx
//                    xwpfDocument.write(Files.newOutputStream(Paths.get(OUTPUT_DOCX_PATH)));
//                    // 输出为PDF
//                    PdfConverter.getInstance().convert(xwpfDocument, Files.newOutputStream(Paths.get(OUTPUT_PDF_PATH)), PdfOptions.create());
//                }
//            }
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//    public class DetailTablePolicy extends DynamicTableRenderPolicy {
//
//        // 货品填充数据所在行数
//        int goodsStartRow = 2;
//        // 人工费填充数据所在行数
//        int laborsStartRow = 5;
//
//        @Override
//        public void render(XWPFTable table, Object data) throws Exception {
//            if (null == data) return;
//            DetailData detailData = (DetailData) data;
//
//            // 人工费
//            List<RowRenderData> labors = detailData.getLabors();
//            if (null != labors) {
//                table.removeRow(laborsStartRow);
//                // 循环插入行
//                for (int i = 0; i < labors.size(); i++) {
//                    XWPFTableRow insertNewTableRow = table.insertNewTableRow(laborsStartRow);
//                    for (int j = 0; j < 7; j++) insertNewTableRow.createCell();
//
//                    // 合并单元格
//                    TableTools.mergeCellsHorizonal(table, laborsStartRow, 0, 3);
//                    // 单行渲染
//                    TableRenderPolicy.Helper.renderRow(table.getRow(laborsStartRow), labors.get(i));
//                }
//            }
//
//            // 货物
//            List<RowRenderData> goods = detailData.getGoods();
//            if (null != goods) {
//                table.removeRow(goodsStartRow);
//                for (int i = 0; i < goods.size(); i++) {
//                    XWPFTableRow insertNewTableRow = table.insertNewTableRow(goodsStartRow);
//                    for (int j = 0; j < 7; j++) insertNewTableRow.createCell();
//                    TableRenderPolicy.Helper.renderRow(table.getRow(goodsStartRow), goods.get(i));
//                }
//            }
//        }
//    }
//
//    private Templates22 initTemplates() {
//        // 填充一些基本信息
//        Templates22 templates = new Templates22();
//        templates.setName("牧羊人OVO");
//        templates.setAliases("牧羊人OVo");
//        templates.setDeptName("青龙小组");
//        templates.setSexName("未知");
//        templates.setPeoples("汉族");
//        templates.setBirth("2000");
//        templates.setCulture("小学");
//        return templates;
//    }
//
//    /**
//     * 测试数据、实际是需要查询数据库的
//     *
//     * @return
//     */
//    private List<FamilyMember> initFamilyMember() {
//        List<FamilyMember> familyMemberList = new ArrayList<>();
//        for (int i = 0; i < 3; i++) {
//            FamilyMember familyMember = new FamilyMember();
//            familyMember.setRelationship("关系" + i);
//            familyMember.setName("姓名" + i);
//            familyMember.setPosition("职位" + i);
//            familyMemberList.add(familyMember);
//        }
//        return familyMemberList;
//    }
//
//    /**
//     * 测试数据
//     *
//     * @return
//     */
//    private List<Going> initGoing() {
//        List<Going> goingList = new ArrayList<>();
//        for (int i = 0; i < 3; i++) {
//            Going going = new Going();
//            going.setCompany("工作单位" + i);
//            going.setAddress("地址" + i);
//            going.setPhone("程联系电话" + i);
//            goingList.add(going);
//        }
//        return goingList;
//    }
//}
